package com.shunhao.widgets

import android.os.Handler
import android.os.Looper
import android.os.Message
import java.lang.ref.WeakReference

/**
 *
 *
 * 子类如果是内部类请使用静态内部类
 * 使用弱引用持有ui/逻辑对象，解决handler持有外部类引用造成的内存溢出
 */
abstract class WeakHandler<T> : Handler {

    private var mReference: WeakReference<T>

    /**
     * 创建子线程Handler使用的构造器
     *
     * @param reference ui/逻辑对象引用
     */
    constructor(looper: Looper?, reference: T) : super(looper!!) {
        mReference = WeakReference(reference)
    }

    /**
     * 创建主线程Handler使用的构造器
     *
     * @param reference ui/逻辑对象引用
     */
    constructor(reference: T) {
        mReference = WeakReference(reference)
    }

    override fun handleMessage(msg: Message) {
        super.handleMessage(msg)
        val t = mReference.get() ?: return
        handleMessage(t, msg)
    }

    /**
     * @param t       持有的引用
     * @param message 收到的消息
     */
    protected abstract fun handleMessage(t: T, message: Message?)
}